package com.example.tester.service.impl;

import com.example.tester.service.RedisService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;

/**
 * 基于RedisTemplate的redisService实现
 * @author lzh
 * @date 2019/9/9 - 15:17
 */
@Service
public class RTServiceImpl implements RedisService {


    /**
     * RedisTemplate和StringRedisTemplate的区别：
     *
     * 1. 两者的关系是StringRedisTemplate继承RedisTemplate。
     *
     * 2. 两者的数据是不共通的；也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据，RedisTemplate只能管理RedisTemplate中的数据。
     *
     * 3. SDR默认采用的序列化策略有两种，一种是String的序列化策略，一种是JDK的序列化策略。
     *
     * StringRedisTemplate默认采用的是String的序列化策略，保存的key和value都是采用此策略序列化保存的。
     *
     * RedisTemplate默认采用的是JDK的序列化策略，保存的key和value都是采用此策略序列化保存的
     * ————————————————
     * 版权声明：本文为CSDN博主「易樊」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。
     * 原文链接：https://blog.csdn.net/yifanSJ/article/details/79513179
     */
    @Resource
    private RedisTemplate redisTemplate;

    @Override
    public void setKeyAndObj(String key, Object obj) {
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        operations.set(key,obj);
    }

    @Override
    public void setObj( String key, Object obj, long timeout , TimeUnit unit) {
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        operations.set(key, obj, timeout, unit);
    }
    @Override
    public Object getObj(final String key) {
        return redisTemplate.opsForValue().get(key);
    }

    @Override
    public void delete(String key) {
        redisTemplate.delete(key);
    }
}
